package com.archeanx.libx.adapter.binding

import androidx.annotation.LayoutRes
import com.archeanx.libx.adapter.R

abstract class XRvBindingPureDataAdapter<T> : XRvPureBindingAdapter() {

    companion object {
        const val NO_MORE_DATA_TAG = 11111

        /**
         * 没有更多数据Layout
         */
        var noMoreDataLayout = R.layout.x_adapter_no_more_data_item
    }

    /**
     * 一般数据
     */
    val listData = mutableListOf<T>()

    /**
     * 是否显示 没有更多多数据 条目
     */
    var isShowNoMoreData = false

    /**
     * 显示/隐藏 没有更多数据
     */
    fun showNoMoreData(isShow: Boolean = true) {
        if (isShowNoMoreData == isShow) {
            return
        }
        isShowNoMoreData = isShow
        if (isShowNoMoreData) {
            notifyItemRangeInserted(listData.size, 1)
        } else {
            notifyItemRangeRemoved(listData.size, 1)
        }
    }


    /**
     * 当需要显示 没有更多数据条目时，itemCount数量需要+1
     */
    final override fun getItemCount(): Int {
        return if (isShowNoMoreData) {
            listData.size + 1
        } else {
            listData.size
        }
    }

    /**
     * 请使用 getItemViewBindingType 来判断 viewtype
     */
    final override fun getItemViewType(position: Int): Int {
        if (position < 0 || position >= itemCount) {
            return 0
        }
        return if (isShowNoMoreData && position == itemCount - 1) {
            NO_MORE_DATA_TAG
        } else {
            getItemViewBindingType(position)
        }
    }

    open fun getItemViewBindingType(position: Int): Int {
        return 0
    }

    final override fun getItemLayout(viewType: Int): Int {
        return if (viewType == NO_MORE_DATA_TAG) {
            //没有更多数据item 不需要点击事件
            addNoListenerLayout(getNoMoreDataLayout())
            getNoMoreDataLayout()
        } else {
            getBindingItemLayout(viewType)
        }
    }

    @LayoutRes
    abstract fun getBindingItemLayout(viewType: Int): Int

    /**
     * 设置 没有更多数据 Layout
     */
    @LayoutRes
    fun getNoMoreDataLayout(): Int {
        return noMoreDataLayout
    }

    final override fun onBindViewHolder(holder: XRvBindingHolder, position: Int) {
        if (isShowNoMoreData && position == itemCount - 1) {
            onBindNoMoreDataViewHolder(holder, position)
        } else {
            onBindViewHolder(holder, position, getItem(position))
        }
    }

    override fun onBindViewHolder(holder: XRvBindingHolder, position: Int, payloads: MutableList<Any>) {
        super.onBindViewHolder(holder, position, payloads)

    }

    /**
     *
     */
    abstract fun onBindViewHolder(holder: XRvBindingHolder, position: Int, data: T)

    /**
     *  对 没有更多数据 layout 处理
     */
    open protected fun onBindNoMoreDataViewHolder(holder: XRvBindingHolder, position: Int) {

    }


    /**
     * 数据替换 ，带刷新
     *
     * @param list     数据
     * @param isRefresh 是否刷新
     */
    open fun setDatas(list: MutableList<T>, isRefresh: Boolean = true) {
        listData.clear()
        listData.addAll(list)
        if (isRefresh) {
            notifyDataSetChanged()
        }
    }

    /**
     * 增加一个data
     *
     * @param data      数据
     * @param isRefresh 是否刷新
     */
    open fun addData(data: T, isRefresh: Boolean = true) {
        listData.add(data)
        if (isRefresh) {
            notifyItemRangeInserted(listData.size - 1, 1)
        }
    }

    /**
     * 数据集合增加数据 带刷新
     *
     * @param data      数据
     * @param isRefresh 是否刷新
     */
    open fun addDatas(datas: MutableList<T>, isRefresh: Boolean = true) {
        listData.addAll(datas)
        if (isRefresh) {
            notifyItemRangeInserted(listData.size - datas.size, datas.size)
        }
    }

    /**
     * 移除data
     *
     * @param data 对象
     * @return 是否移除成功
     */
    open fun removeData(data: T): Boolean {
        return listData.remove(data)
    }

    /**
     * 移除所有数据
     */
    open fun removeDataAll() {
        listData.clear()
        notifyDataSetChanged()
    }


    /**
     * 移除data
     *
     * @param index 下标
     * @return
     */
    open fun removeData(index: Int): Boolean {
        return if (index >= 0) {
            if (index < listData.size) {
                listData.removeAt(index)
                notifyItemRangeRemoved(index, 1)
                true
            } else {
                false
            }
        } else {
            false
        }
    }

    /**
     * 得到单个item
     *
     * @param position item的下标
     * @return 集合中的某个对象
     */
    open fun getItem(position: Int): T {
        return listData[position]
    }


}
